在hexo new之后立即打开Markdown文稿

  之前已经说过,在hexo中新建一篇博文非常简单,只需要在git bash中输入以下命令回车执行即可。

1
> hexo new "title"

  一般新建完之后,就需要对该博文源代码进行编辑,通常你需要依次打开 hexo-home/source/_post 目录,然后在成堆的Markdown文件中找到刚才创建的文档title.md。虽然hexo以你输入的title来给你的Markdown文件命名,命名的不咋地(诸如,空格和.变成-,括号(xxx)变成-xxx-,而且通常我们需要为博文源代码文件名字加个前缀,这样更加容易管理),你通常需要找到该文件,重新起个名字再打开,但是很多时候,命名的还是过得去的。藏在这么深的目录下,每次都得去找一番甚是烦人,有没有什么办法能够创建完(也就是敲个回车)之后自动帮我们用系统上已经安装的Markdown编辑器打开呢?

搜寻

  所以上网一搜,搜到这样一篇文章《在 hexo new 之后立即打开新建的 Markdown 文稿》。内容嘛,这里就不多说了,大概的步骤我就摘在下面,有兴趣的你可以点进去看一下。


  Tommy (就是弄这个Hexo的鼻祖,博主还说Hexo是其时为大学生的台湾人Tommy开发的轻量级静态博客生成器,具有简洁、快速、扩展性好等特点,我们都得感谢此大牛,真心感谢,这个好东西,太赞了!!) 指出,可以在 Hexo 目录下的 scripts 目录(若没有,则新建一个)中创建一个JavaScript 脚本,监听 hexo new 这个动作。并在检测到 hexo new 之后,执行编辑器打开的命令。
  Tommy给出的代码如下:
1
2
3
4
5
6
7
8
9
10
11
var spawn = require('child_process').spawn;

// Hexo 2.x
hexo.on('new', function(path){
spawn('vi', [path]);
});

// Hexo 3
hexo.on('new', function(data){
spawn('vi', [data.path]);
});


  博主就是参考这个代码,领悟到其精髓后,给出了自己实践可行的代码。
  我 (是该博客博主,蓝色部分均摘自博客) 使用的 Hexo 是 2.5.4 版本,然而,测试过 Tommy 给出的代码之后并没有顺利地打开编辑器。不过精髓已经理解,需要的就只是细节的改变了。
  简单翻阅了一下 JavaScript 的语法规则,我尝试了下列 JavaScript 代码:
1
2
3
4
5
6
var exec = require('child_process').exec;

// Hexo 2.x
hexo.on('new', function(path){
exec('open -a "/Applications/Sublime Text.app" ' + path);
});


  注意,我这里执行的系统命令,是 OS X 下的 open。换到 Windows 中,可能需要改为 start。

  卧槽,博主有钱淫,用的是苹果机…我可是穷渣渣,只能用Windows,那他说可能改为start,我就试一下嘛,照着他说的一步一步来(如果你是苹果机,可以照着这里的代码改改看,应该可以吧,虽然我没试过)。

试水

  第一步:
   在根目录新建一个文件夹scripts(因为本来没有,只能新建),然后新建txt文本文件,重命名为 “open_editor_after_hexo_new_immediately.js”,这个在Windows下干活的人都知道吧,名字可以随便,不过我觉得这个名字比较好认,你以后可能要改也方便。

  第二步:
   随便用一个文本编辑器打开,我是习惯用Sublime Text。修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var exec = require('child_process').exec;

// Hexo 2.x 传进来的参数即是路径
/*
hexo.on('new', function(path){
exec('"S:\\Hexo\\MarkdownPad2\\MarkdownPad2.exe" ' + "\"" + [path] + "\"");
});
*/

// Hexo 3 传进来的参数是一个{}定义的多属性对象,
// 参见"hexo根目录/node_modules/hexo/lib/plugins/console/new.js"
hexo.on('new', function(data){
exec('"S:/Hexo/MarkdownPad2/MarkdownPad2.exe" ' + "\"" + [data.path] + "\"");
});

回头分析

  其实上面的代码是经过近半个小时的折腾才弄出来的,亲测可用。现在说说这个过程顺便简单分析一下。
   1. 首先当然是试了博主的代码,只不过改了start,之前是知道startCMD里面用于重新打开一个窗口的命令;还有就是,参考鼻祖的Hexo 3的代码,因为之前已经说过,我从2.x迁移到3了(你也看到上面Hexo 2.x部分被我注释掉了)。试了一下,报-a参数错误,肯定就把他删了再试,心想,而且知道这代码确实监听到我的hexo new命令了。
   2. 再new再回车,结果报“找不到文件D:/Workspace/Hexo”的错误,不过这个路径好像就是我Hexo根目录的路径,只不过,我那个是“D:/Workspace/Hexo Workspace”,我看到路径里面有个空格,想到以前曾经在CMD上踩过的坑,果断知道需要给路径加上个引号什么的。
   3. 还好之前也弄过一点Javascript,知道用个”+”来拼接就行了,就试了一下。显然你去弄的话也知道这里还需要灵活使用一下转义符\反斜杠。再试。
   4. 成功用我系统上的编辑器MarkdownPad2打开我新new的博文源代码。我也明白了,其中原理不过像我们在CMD里面敲的一样吗,只不过这个CMD起始路径不知道而已,我想应该就是Git Bash的路径吧(这里就是我的Hexo根目录“D:/Workspace/Hexo Workspace”)。反正我们上面用的都是绝对路径,这点就无所谓了。
   5. 想到这里,我想start也是没必要的,去掉一试,就成了上面的最终代码了。
  之后也想弄清楚一下两个版本的代码为什么要不一样,心想传进来的其实都是函数的形式参数(本人有一点JS基础,不过跟其他语言在这一块原理差不多),只不过一个直接用,一个还需要索引。心想命令是hexo new,就去Hexo根目录的node_modules找一下,应该有这么个名字的JS文件,果不其然,在“hexo根目录/node_modules/hexo/lib/plugins/console/new.js”,里面有段代码,内容如下:

1
2
3
4
5
6
var data = {
title: args._.pop(),
layout: args._.length ? args._[0] : this.config.default_layout,
slug: args.s || args.slug,
path: args.p || args.path
};

  然后上网了解到JS里面用{}定义的叫做多属性对象,猜测Hexo 3传进来给new监听函数的参数是应该一个{}定义的多属性对象(如上面代码),通过.操作符获取其path属性,而Hexo 2.x传进来的参数应该就是一个普通变量吧,通过不一样的方式获取到新建Markdown文件的全局路径。

Windows CMD下的\/

  如果你仔细看上面我贴的用于Hexo 3Hexo 2.x的代码,你会发现,上面用来获取MarkdownPad2编辑器的路径有点不一样,熟悉CMD的人应该都知道,这两种方式都是可以的,下面是我获取到的资料:


   Windows 用反斜杠(”\”)的历史来自 DOS,而 DOS 的另一个传统是用斜杠(”/“)表示命令行参数,比如:
1
2
cd %SystemDrive%dir 
/s /b shell32.dll


   既然 DOS 这边斜杠被占用了,只好找一个最接近的。那就是”\”了。
   而在 UNIX 环境中,我们用减号(”-“)和双减号(”–”)表示命令行参数。
   我们也知道,转义字符不是都用”\”么,所以如果用来当文件路径的话就要写成”\“。
文章目录
  1. 1. 搜寻
  2. 2. 试水
  3. 3. 回头分析
  4. 4. Windows CMD下的\和/